﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Entity;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Siser.Web.Models;
using Siser.Web.Models.JsonResponses;
using Siser.Web.Shared;

namespace Siser.Web.Controllers
{ 
    public class PiezaController : Controller
    {
        private SiserEntities db = new SiserEntities();

        //
        // GET: /Pieza/

        public ViewResult Index()
        {
            var piezas = db.Piezas.Include(p => p.Fabricante).Include(p => p.TipoPieza).Include(p => p.Unidad).Include(p => p.NivelDeclaracionAlarma).Include(p => p.EstadoMantencion).Include(p => p.EstadoCalibracion);
            return View(piezas.ToList());
        }

        //
        // GET: /Pieza/Details/5

        public ViewResult Details(int id)
        {
            Pieza pieza = db.Piezas.Find(id);
            return View(pieza);
        }

        //
        // GET: /Pieza/Create

        public ActionResult Create()
        {
            ViewBag.FabricanteId = new SelectList(db.Fabricantes, "Id", "Nombre");
            ViewBag.TipoPiezaId = new SelectList(db.TiposPiezas, "Id", "Nombre");
            ViewBag.UnidadId = new SelectList(db.Unidades, "Id", "Nombre");
            ViewBag.NivelDeclaracionAlarmaId = new SelectList(db.NivelesDeclaracionesAlarmas, "Id", "Id");
            ViewBag.EstadoMantencionId = new SelectList(db.EstadosMantenciones, "Id", "Nombre");
            ViewBag.EstadoCalibracionId = new SelectList(db.EstadosCalibraciones, "Id", "Nombre");
            return View();
        } 

        //
        // POST: /Pieza/Create

        [HttpPost]
        public ActionResult Create(Pieza pieza)
        {
            if (ModelState.IsValid)
            {
                db.Piezas.Add(pieza);
                db.SaveChanges();
                return RedirectToAction("Index");  
            }

            ViewBag.FabricanteId = new SelectList(db.Fabricantes, "Id", "Nombre", pieza.FabricanteId);
            ViewBag.TipoPiezaId = new SelectList(db.TiposPiezas, "Id", "Nombre", pieza.TipoPiezaId);
            ViewBag.UnidadId = new SelectList(db.Unidades, "Id", "Nombre", pieza.UnidadId);
            ViewBag.NivelDeclaracionAlarmaId = new SelectList(db.NivelesDeclaracionesAlarmas, "Id", "Id", pieza.NivelDeclaracionAlarmaId);
            ViewBag.EstadoMantencionId = new SelectList(db.EstadosMantenciones, "Id", "Nombre", pieza.EstadoMantencionId);
            ViewBag.EstadoCalibracionId = new SelectList(db.EstadosCalibraciones, "Id", "Nombre", pieza.EstadoCalibracionId);
            return View(pieza);
        }
        
        //
        // GET: /Pieza/Edit/5
 
        public ActionResult Edit(int id)
        {
            Pieza pieza = db.Piezas.Find(id);
            ViewBag.FabricanteId = new SelectList(db.Fabricantes, "Id", "Nombre", pieza.FabricanteId);
            ViewBag.TipoPiezaId = new SelectList(db.TiposPiezas, "Id", "Nombre", pieza.TipoPiezaId);
            ViewBag.UnidadId = new SelectList(db.Unidades, "Id", "Nombre", pieza.UnidadId);
            ViewBag.NivelDeclaracionAlarmaId = new SelectList(db.NivelesDeclaracionesAlarmas, "Id", "Id", pieza.NivelDeclaracionAlarmaId);
            ViewBag.EstadoMantencionId = new SelectList(db.EstadosMantenciones, "Id", "Nombre", pieza.EstadoMantencionId);
            ViewBag.EstadoCalibracionId = new SelectList(db.EstadosCalibraciones, "Id", "Nombre", pieza.EstadoCalibracionId);
            return View(pieza);
        }

        //
        // POST: /Pieza/Edit/5

        [HttpPost]
        public ActionResult Edit(Pieza pieza)
        {
            if (ModelState.IsValid)
            {
                db.Entry(pieza).State = EntityState.Modified;
                db.SaveChanges();
                return RedirectToAction("Index");
            }
            ViewBag.FabricanteId = new SelectList(db.Fabricantes, "Id", "Nombre", pieza.FabricanteId);
            ViewBag.TipoPiezaId = new SelectList(db.TiposPiezas, "Id", "Nombre", pieza.TipoPiezaId);
            ViewBag.UnidadId = new SelectList(db.Unidades, "Id", "Nombre", pieza.UnidadId);
            ViewBag.NivelDeclaracionAlarmaId = new SelectList(db.NivelesDeclaracionesAlarmas, "Id", "Id", pieza.NivelDeclaracionAlarmaId);
            ViewBag.EstadoMantencionId = new SelectList(db.EstadosMantenciones, "Id", "Nombre", pieza.EstadoMantencionId);
            ViewBag.EstadoCalibracionId = new SelectList(db.EstadosCalibraciones, "Id", "Nombre", pieza.EstadoCalibracionId);
            return View(pieza);
        }

        //
        // GET: /Pieza/Delete/5
 
        public ActionResult Delete(int id)
        {
            Pieza pieza = db.Piezas.Find(id);
            return View(pieza);
        }

        //
        // POST: /Pieza/Delete/5

        [HttpPost, ActionName("Delete")]
        public ActionResult DeleteConfirmed(int id)
        {
                      //verifica que no tenga asociado un equipo.
                var listaEquipoPieza = (from ep in db.EquiposPiezas
                                          join p in db.Piezas on ep.PiezaId equals p.Id
                                          where p.Id == id
                                          select ep).ToList();

                if (listaEquipoPieza.Count == 0)//si no tiene equipo-Pieza asociada se procede a eliminar.
                {
                    Pieza pieza = db.Piezas.Find(id);
                    db.Piezas.Remove(pieza);
                    db.SaveChanges();
                    return RedirectToAction("Index");
                }
                else //si tiene equipo asociado se envia mensaje.
                {
                    TempData["texto2"] = "Debe eliminar la asociación entre Equipo-Pieza para eliminar la Pieza.";
                    return View("Delete");
                }
            
        }

        protected override void Dispose(bool disposing)
        {
            db.Dispose();
            base.Dispose(disposing);
        }

        #region "   Ficha Monitoreo"

        public ActionResult FichaMonitoreo(int id)
        {
            var pieza = (from e in db.Equipos
                         join ep in db.EquiposPiezas on e.Id equals ep.EquipoId
                         join p in db.Piezas on ep.PiezaId equals p.Id
                         join nda in db.NivelesDeclaracionesAlarmas on p.NivelDeclaracionAlarmaId equals nda.Id
                         join u in db.Unidades on p.UnidadId equals u.Id
                         join i in db.Instalaciones on e.InstalacionId equals i.Id
                         join emp in db.Empleados on i.EncargadoId equals emp.Id
                         where e.Vigencia == true
                            && ep.FechaFin == null
                            && p.Id == id
                            && nda.FechaFin == null
                         select p).FirstOrDefault();

            return View(pieza);
        }

        [HttpPost]
        public JsonResult GetMediciones(int id)
        {
            JsonDataDetector jsonDataDetector = new JsonDataDetector();
            DateTime fechaInicio = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, 00, 00, 00);
            DateTime fechaFin = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, 23, 59, 59);
            Medicion ultimaMedicion = null;
            Medicion Horaultimamedicion = null;

            var mediciones = (from e in db.Equipos
                              join ep in db.EquiposPiezas on e.Id equals ep.EquipoId
                              join p in db.Piezas on ep.PiezaId equals p.Id
                              join m in db.Mediciones on p.Id equals m.PiezaId
                              join nda in db.NivelesDeclaracionesAlarmas on p.NivelDeclaracionAlarmaId equals nda.Id
                              join u in db.Unidades on p.UnidadId equals u.Id
                              where p.Id == id
                                 && e.Vigencia == true
                                 && ep.FechaFin == null
                                 && m.Fecha >= fechaInicio
                                 && m.Fecha <= fechaFin
                                 && nda.FechaFin == null
                                 && (m.RegistroMedida=="F" || m.RegistroMedida=="P" || m.RegistroMedida=="D" ||m.RegistroMedida=="I")
                              orderby m.Fecha ascending
                              select m).ToList();

            // Si no hay mediciones retorno null
            if (mediciones.Count == 0)
                return Json(null);

            jsonDataDetector.Mediciones = (from m in mediciones
                                           select new JsonDataMedicion
                                           {
                                               Fecha = m.Fecha,
                                               Valor = m.Valor
                                           }).ToList();

            ultimaMedicion = mediciones.OrderByDescending(m => m.Fecha).First();
            Horaultimamedicion = mediciones.OrderByDescending(m => m.Fecha).First();
            jsonDataDetector.UltimaMedicion = ultimaMedicion.Valor;
            jsonDataDetector.HoraUltimaMedicion = Convert.ToString(ultimaMedicion.Fecha);
            jsonDataDetector.ValorInvestigacion = ultimaMedicion.Pieza.NivelDeclaracionAlarma.ValorInvestigacion;
            jsonDataDetector.ValorIntervencion = ultimaMedicion.Pieza.NivelDeclaracionAlarma.ValorIntervencion;
            jsonDataDetector.Unidad = ultimaMedicion.Pieza.Unidad.Nombre;

            // No se debe dejar dijo el nombre del sistema ya que puede ser cabiado, se sugiere agregar un valor fijo en la base de datos
            if (ultimaMedicion.Pieza.EquiposPiezas.Where(ep => ep.FechaFin == null).FirstOrDefault() != null &&
                ultimaMedicion.Pieza.EquiposPiezas.Where(ep => ep.FechaFin == null).First().Equipo.Sistema.Nombre.Equals("Fijo", StringComparison.CurrentCultureIgnoreCase) || ultimaMedicion.Pieza.EquiposPiezas.Where(ep => ep.FechaFin == null).First().Equipo.Sistema.Nombre.Equals("Protección+Fijo", StringComparison.CurrentCultureIgnoreCase))
            {
                jsonDataDetector.Puerta = ultimaMedicion.EstadoGabinete.Substring(0, 1) == "1" ? "ABIERTA" : "CERRADA" ;
                jsonDataDetector.Energia = ultimaMedicion.EstadoGabinete.Substring(2, 1) == "1" ? "PRESENTE":"AUSENTE" ;
            }
                else
            {
                jsonDataDetector.Puerta = ultimaMedicion.EstadoGabinete.Substring(0, 1) == "1" ? "ABIERTA" : "CERRADA" ;
                jsonDataDetector.Energia = ultimaMedicion.EstadoGabinete.Substring(1, 1) == "1" ? "PRESENTE" : "AUSENTE";
            }

            if (ultimaMedicion.Valor > ultimaMedicion.Pieza.NivelDeclaracionAlarma.ValorIntervencion)
                jsonDataDetector.NivelReferencia = "INTERVENCION";
            else if (ultimaMedicion.Valor > ultimaMedicion.Pieza.NivelDeclaracionAlarma.ValorInvestigacion)
                jsonDataDetector.NivelReferencia = "INVESTIGACION";
            else
                jsonDataDetector.NivelReferencia = "REGISTRO";

            if (jsonDataDetector.NivelReferencia != "REGISTRO")
                if (jsonDataDetector.NivelReferencia == "INTERVENCION")
                    jsonDataDetector.Estado = "ALARMA INTERVENCION";
                else
                    jsonDataDetector.Estado = "ALARMA INVESTIGACION";
            else
                if (jsonDataDetector.Puerta == "ABIERTA" || jsonDataDetector.Energia == "AUSENTE")
                    jsonDataDetector.Estado = "ALARMA INVESTIGACION";
                else
                    jsonDataDetector.Estado = "Operación normal";



            jsonDataDetector.Maximo = Shared.Math.Maximum(mediciones);
            jsonDataDetector.Minimo = Shared.Math.Minium(mediciones);
            jsonDataDetector.Promedio = (float)Shared.Math.Average(mediciones);
            jsonDataDetector.DesviacionEstandar = (float)Shared.Math.StandardDeviation(mediciones);

            return Json(jsonDataDetector);
        }
        #endregion
    }
}